package com.cmfi.utils;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class QRCodeGeneratorUtils {

	private static final Logger log = LoggerFactory.getLogger(QRCodeGeneratorUtils.class);

	/**
	 * 生成永久二维码
	 * @param text     要编码为二维码的文本内容
	 * @param width    二维码的宽度
	 * @param height   二维码的高度
	 * @param filePath 生成的二维码图片保存的路径
	 */
	public static void generateQRCodeImage(String text, int width, int height, String filePath) {
		Graphics2D graphics = null;
		try {
			// 创建 QRCodeWriter 实例
			QRCodeWriter qrCodeWriter = new QRCodeWriter();

			// 设置编码提示信息，这里设置错误校正级别为 L
			Map<EncodeHintType, Object> hints = new HashMap<>();
			hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);

			// 编码文本内容为 BitMatrix
			BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);

			// 创建 BufferedImage 对象，用于绘制二维码图像
			BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

			// 获取 Graphics2D 对象，用于绘图
			graphics = (Graphics2D) bufferedImage.getGraphics();

			// 设置背景颜色为白色
			graphics.setColor(Color.WHITE);
			graphics.fillRect(0, 0, width, height);

			// 设置前景颜色为黑色
			graphics.setColor(Color.BLACK);

			// 根据 BitMatrix 绘制二维码
			for (int i = 0; i < width; i++) {
				for (int j = 0; j < height; j++) {
					if (bitMatrix.get(i, j)) {
						// 如果当前位为 true，则绘制一个黑色的小方块
						graphics.fillRect(i, j, 1, 1);
					}
				}
			}
			
			File file = new File(filePath);
			if (!file.exists()) {
				file.createNewFile();
			}
			// 将生成的二维码图像写入指定的文件中进行覆盖
			ImageIO.write(bufferedImage, "png", new File(filePath));
		} catch (WriterException | IOException e) {
			//log.info("[QRCodeGeneratorUtils][generateQRCodeImage] e,", e);
		} finally {
			// 关闭 Graphics2D 对象
			graphics.dispose();
		}
	}

	/**
	 * Description 生成二维码图片
	 * @param qrCodeImagePath 二维码图片的保存路径
	 * @param qrCodeText      要编码为二维码的文本内容
	 */
	public static void generateQRCodeImage(String qrCodeImagePath, String qrCodeText) {
		try {
			// 调用qrCodeGeneratorUtils工具类的generateQRCodeImage方法生成二维码图片
			// 参数分别为：要编码的文本、二维码宽度、二维码高度、二维码图片的保存路径
			generateQRCodeImage(qrCodeText, 350, 350, qrCodeImagePath);
		} catch (Exception e) {
			log.info("[QRCodeGeneratorUtils][getQRCode] e,", e);
		}
	}

	public static void main(String[] args) {
		generateQRCodeImage("C:\\Users\\Lenovo\\Desktop\\qiuhuanhuan\\二维码\\二维码.png", "dewafdsafdsaggsagas范德萨发大水范德萨发eeeee");
	}

}
